package ceura.ia.practica;

/**
 * Representación de una matriz de dos dimensiones (n x m) que se pasa por
 * parámetro al calculador para que resuelva el laberinto, esta clase contiene
 * además los puntos de origen y destino del laberinto.
 *
 * El calculador irá descubriendo nodos y moviendo la situación inicial de lugar
 * hasta alcanzar el destino y comprobar que sea la mejor ruta.
 *
 * @author Sergio Redondo y Jorge Madrid.
 */
public class Laberinto {

    /**
     * Columnas del laberinto.
     */
    public final int m,
            /**
             * Filas del laberinto.
             */
            n;
    /**
     * Objeto situación que representa el estado actual de la busqueda del
     * camino más corto.
     */
    public Situacion situacion;
    /**
     * La situación final que debe alcanzar el algoritmo dado un punto de
     * origen.
     */
    public Point situacionFinal;
    private int[][] mapa;

    /**
     *
     * @param n Número de filas.
     * @param m Número de columnas.
     * @param situacion Objeto situación para representar la situación inicial.
     * @param situacionFinal Punto de destino del laberinto.
     */
    public Laberinto(int n, int m, Situacion situacion, Point situacionFinal) {
        this.m = m;
        this.n = n;
        this.situacion = situacion;
        this.situacionFinal = situacionFinal;
        initMapa();
    }

    private void initMapa() {
        mapa = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                mapa[i][j] = 0;
            }
        }
    }

    /**
     *
     * @param posicion Punto a comprobar hay agua.
     * @return Si hay agua o no.
     */
    public boolean isAgua(Point posicion) {
        return mapa[posicion.x][posicion.y] == -1;
    }

    /**
     *
     * @param posicion Punto a partir del cual devolvemos el valor del array que
     * representa el laberinto.
     * @return El valor del laberinto el dicho punto ( 0 o -1 (Agua) ).
     */
    public int getPosicion(Point posicion) {
        return mapa[posicion.x][posicion.y];
    }

    /**
     *
     * @param posicion Punto sobre el que se aplicara agua en el mapa del
     * laberinto.
     */
    public void setAgua(Point posicion) {
        mapa[posicion.x][posicion.y] = -1;
    }
}
